package com.net.protocol;

import com.net.protocol.util.Logger;

/**
 * 由于java线程run方法一旦执行完成，就不能再次调用start，必须new新的对象才可以启动新的线程。
 * 这里提供一个变通方法实现线程的重启和停止
 *
 */
public abstract class RestartableThread extends Thread {

    private static final String TAG = "{RestartableThread}";

    private byte[] lock = new byte[1]; // 锁对象

    @Override
    public void run() {
        while (true) {
            execute(); // 执行业务
            synchronized (lock) {
                try {
                    Logger.i(TAG, "----2.线程" + getName() + "阻塞----");
                    lock.wait();
                    Logger.i(TAG, "----4.线程" + getName() + "被唤醒----");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 重启线程,若线程没有启动则启动，否则重启线程
     */
    public synchronized final void restart() {
        if (isAlive()) { // 线程已启动则重启
            synchronized (lock) {
                lock.notify(); // 唤醒当前线程
            }
        } else {
            Logger.i(TAG, "----1.线程" + getName() + "第一次启动----");
            start(); // 线程没有启动则启动
        }
    }

    /**
     * 要在线程中执行的操作
     */
    public abstract void execute();

}
